package com.aaa.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.aaa.entity.MyReturn;

import java.util.HashMap;
import java.util.Map;

/**
 * @author ：Teacher陈（86521760@qq.com）
 * @date ：Created in 2022/6/2 10:53
 * @description：我的工具类
 * @modified By：
 * @version: 1.0
 */
public class MyTools {
    /**
     * @create by: Teacher陈（86521760@qq.com）
     * @description: 组装sql语句
     * @create time: 2022/6/2 10:53
     * @param    oldSql 老的sql
     * @param   map   传入的参数
     * @param   countFlag   是否获取总条数
     * @return String  新的sql
     */
      public static String makeSql(String oldSql, Map<String,Object> map,boolean countFlag){
          //1、非空判断
          StringBuffer sql=new StringBuffer(oldSql);
          if(map!=null||map.size()>0){

              //获取所有的查询条件
              Map<String,String> whereMap= new HashMap<>();
              for (String key : map.keySet()) {
                  if(key.contains("search")){
                      //去掉前缀的search标记，方便sql语句查询
                      whereMap.put(key.replace("search",""),map.get(key)+"");
                  }
              }
              //拼接where查询条件
              for (Map.Entry<String, String> entry : whereMap.entrySet()) {
                  sql.append(" and " +entry.getKey() +" like "+" '%"+entry.getValue()+"%' ");
              }
              //3、判断是否排序
              if(ObjectUtil.isNotEmpty(map.get("field"))){
                  String field = map.get("field")+"";
                  String order = map.get("order")+"";
                  sql.append(" order by ").append(field).append(" ").append(order);
              }
              //如果不是获取总条数，开始分页查询
              if(!countFlag){
                  //2、判断是否分页
                  if(ObjectUtil.isNotEmpty(map.get("page"))){
                      Integer page = Integer.parseInt(map.get("page")+"");
                      Integer limit = Integer.parseInt(map.get("limit")+"");
                      sql.append(" limit ").append((page - 1) * limit).append(",").append(limit);
                  }
              }


          }
          String string = sql.toString();
          return string;

      }

    /**
     * @create by: Teacher陈
     * @description: 传入一个原始返回对象，得到一个成功的返回对象
     * @create time: 2020/9/17 9:39
     * @param myReturn
     * @return MyResult
     */
    public  static MyReturn getSuccessResult(MyReturn myReturn){
        myReturn.setCode(RetStatusEnum.SUCCESS.getCode());
        myReturn.setMsg(RetStatusEnum.SUCCESS.getMessage());
        return  myReturn;
    }
    /**
     * @create by: Teacher陈
     * @description: 传入一个原始返回对象，得到一个失败的返回对象
     * @create time: 2020/9/17 9:39
     * @param myReturn
     * @return MyResult
     */
    public  static MyReturn getFailResult(MyReturn myReturn){
        myReturn.setCode(RetStatusEnum.FAILE.getCode());
        myReturn.setMsg(RetStatusEnum.FAILE.getMessage());
        return  myReturn;
    }
    public static  String makePassword(String password){
        String md5= SecureUtil.md5(password);
        return md5;
    }
    public static Map<String,String> makePasswordSalt(String password){
        Map<String,String>map=new HashMap<>();

        //随机生成密钥(盐值)
        byte[] key=SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        //将盐值转换格式（方便数据库保存）,byte数组转字符串
        String salt= Base64.encode(key);

        //构建加密对象
        SymmetricCrypto aes=null;

            //Base64.decode(salt);将字符串转换成byte数组
            aes=new SymmetricCrypto(SymmetricAlgorithm.AES,Base64.decode(salt));

        //加密为16进制表示
        String encryptHex=aes.encryptHex(password);
        //加密之后的密文
        map.put("password",encryptHex);
        //盐值，保存盐值的作用是为了登录
        map.put("salt",salt);
        return map;

    }
    public static String makePasswordSalt(String password,String salt){
        //构建
        SymmetricCrypto aes=null;

            aes=new SymmetricCrypto(SymmetricAlgorithm.AES,Base64.decode(salt));

        //加密16进制表示
        String encryptHex=aes.encryptHex(password);
        return encryptHex;
    }
}


























